import java.awt.BorderLayout;
import java.awt.List;
import java.util.HashMap;
import java.util.HashSet;
import java.util.SortedMap;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.SwingConstants;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import java.awt.Component;
import javax.swing.Box;
import javax.swing.ListSelectionModel;
import javax.swing.JTextArea;
import javax.swing.DropMode;
import javax.swing.ListModel;

public class VueConsultPeriodique<jList> extends Vue{
        private JPanel contentPane;
        private JTextField textFieldIssn;
        private JTextField textFieldTitreperio;
        private DefaultListModel model;

        
        // pour que les boutons soient des attributs, il faut faire "convert local to field"
        private JButton btnRechIssn;
        private JButton btnAnnulerIssn;
        
        private JList listParution;
        private JScrollPane scrollPaneParution;
        private JList listArticle;
        private JScrollPane scrollPaneArticle;
    	DefaultListModel dlmParution = new DefaultListModel();
    	DefaultListModel dlmArticle = new DefaultListModel();
    	private JList listAuteur;
    	DefaultListModel dlmAuteur = new DefaultListModel();
               
        
        private JTextField textFieldTitre;
        private JTextField textFieldPage;
        
    	// à ajouter car la vue est observatrice d'un periodique
    	private Periodique _periodique;
    	private Parution _parution;
    	private Article _article;
    	private JScrollPane scrollPaneAuteur;

        /**
         * Create the frame.
         */
        public VueConsultPeriodique(Controleur controleur) {
                super(controleur);
                setTitle("Informations sur un periodique");
                setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
                setBounds(100, 100, 700, 573);
                contentPane = new JPanel();
                contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
                setContentPane(contentPane);
                contentPane.setLayout(null);
                
                JLabel lblNewLabel = new JLabel("Issn");
                lblNewLabel.setHorizontalAlignment(SwingConstants.RIGHT);
                lblNewLabel.setBounds(197, 28, 61, 15);
                contentPane.add(lblNewLabel);
                
                textFieldIssn = new JTextField();
                textFieldIssn.setBounds(355, 26, 114, 19);
                contentPane.add(textFieldIssn);
                textFieldIssn.setColumns(10);
                
                JLabel lblNewLabel_1 = new JLabel("Titre");
                lblNewLabel_1.setHorizontalAlignment(SwingConstants.RIGHT);
                lblNewLabel_1.setBounds(197, 93, 61, 15);
                contentPane.add(lblNewLabel_1);
                
                textFieldTitreperio = new JTextField();
                textFieldTitreperio.setEditable(false);
                textFieldTitreperio.setBounds(355, 91, 114, 19);
                contentPane.add(textFieldTitreperio);
                textFieldTitreperio.setColumns(10);
                
                btnAnnulerIssn = new JButton("Annuler");
                btnAnnulerIssn.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        getControleur().fermerVue(VueConsultPeriodique.this);
                    }
                });
                btnAnnulerIssn.setBounds(197, 56, 100, 25);
                contentPane.add(btnAnnulerIssn);
                
                btnRechIssn = new JButton("Rechercher");
                btnRechIssn.addActionListener(new ActionListener() {
                	public void actionPerformed(ActionEvent e) {
                		String issn = textFieldIssn.getText();
                		setPeriodique(getControleur().rechPeriodique(issn));
            			if(getPeriodique() != null){
        					textFieldTitreperio.setText(getPeriodique().getTitre());
                			alimenteParution(getPeriodique().getParutions());
        				}
                	}
                });
                btnRechIssn.setBounds(355, 57, 114, 25);
                contentPane.add(btnRechIssn);
                
                scrollPaneParution = new JScrollPane();
                scrollPaneParution.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
                scrollPaneParution.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                scrollPaneParution.setBounds(84, 176, 230, 90);
                contentPane.add(scrollPaneParution);
                
                listParution = new JList(dlmParution);
                listParution.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                scrollPaneParution.setViewportView(listParution);
                
                listParution.addMouseListener(new MouseAdapter(){
                	public void mouseClicked(MouseEvent e) {
                		String paru = listParution.getSelectedValue().toString();
                		Periodique periodique = getPeriodique();
                		
                		Parution parution = null;
                		if(periodique != null)
                			parution = _periodique.getParution(paru);
                		
                		if(parution != null)
                			setParution(parution);
                		else {
                			Message dialog4 = new Message("getparu BUG");
                			dialog4.setVisible(true);}
                		
                		if(getParu() != null)
                			alimenteArticle(getParu().getArticles());
                	}
                });

                
                scrollPaneArticle = new JScrollPane();
                scrollPaneArticle.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
                scrollPaneArticle.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                scrollPaneArticle.setBounds(358, 174, 230, 90);
                contentPane.add(scrollPaneArticle);
                
                listArticle = new JList(dlmArticle);
                listArticle.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                scrollPaneArticle.setViewportView(listArticle);
                
                listArticle.addMouseListener(new MouseAdapter(){
                	public void mouseClicked(MouseEvent e) {
                		
                		String art = listArticle.getSelectedValue().toString();
                		
                		Article arti = null;
                		if(art.length() != 0)
                			arti = getParu().getArticle(art);
                		else{
            				Message dialog = new Message("Pbs recuperation article");
            				dialog.setVisible(true);}
                		
                		if(arti != null){
                			textFieldTitre.setText(arti.getTitre());
                	        textFieldPage.setText(String.valueOf(arti.getPageDebut()));
                	        alimenteAuteurs(getControleur().recuperationAuteursArticle(arti)); //a faire dans le controleur : une fonction qui retourne une sortedmap des auteurs d'un article passé en parametre
                	    }
                	}
                });
                
                JLabel lblArticles = new JLabel("Articles :");
                lblArticles.setBounds(355, 148, 71, 14);
                contentPane.add(lblArticles);
                
                JLabel lblParutions = new JLabel("Parutions :");
                lblParutions.setBounds(82, 148, 71, 14);
                contentPane.add(lblParutions);
                
                scrollPaneAuteur = new JScrollPane();
                scrollPaneAuteur.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
                scrollPaneAuteur.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
                scrollPaneAuteur.setBounds(355, 388, 230, 90);
                contentPane.add(scrollPaneAuteur);
                
                listAuteur = new JList(dlmAuteur);
                listAuteur.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                scrollPaneAuteur.setViewportView(listAuteur);
                
                JLabel lblAuteurs = new JLabel("Auteurs :");
                lblAuteurs.setBounds(355, 363, 71, 14);
                contentPane.add(lblAuteurs);
                
                textFieldTitre = new JTextField();
                textFieldTitre.setBounds(446, 292, 142, 20);
                contentPane.add(textFieldTitre);
                textFieldTitre.setColumns(10);
                
                textFieldPage = new JTextField();
                textFieldPage.setColumns(10);
                textFieldPage.setBounds(446, 323, 142, 20);
                contentPane.add(textFieldPage);
                
                JLabel lblTitre = new JLabel("Titre :");
                lblTitre.setBounds(355, 295, 46, 14);
                contentPane.add(lblTitre);
                
                JLabel lblPageDeDebut = new JLabel("Page de debut :");
                lblPageDeDebut.setBounds(333, 326, 108, 17);
                contentPane.add(lblPageDeDebut);
                
                JButton btnQuitter = new JButton("Quitter");
                btnQuitter.addActionListener(new ActionListener() {
        			public void actionPerformed(ActionEvent e) {
        			getControleur().fermerVue(VueConsultPeriodique.this);}
        		});
                btnQuitter.setBounds(300, 501, 100, 25);
                contentPane.add(btnQuitter);
                
                

                //model = new DefaultListModel();
        }
        
        /**
         * alimentation des composants d'affichage en consultant directement l'ouvrage
         *//*
        public void alimente(Periodique per) {
                        textFieldTitreperio.setText(per.getTitre());
                        HashMap<Integer, Parution> parutions = per.getParutions();
                        for(int i=0;i< parutions.size();i++){
                                i : parutions.keySet();
                                model.add(i, parutions.get(i));
                        }
                        this.repaint();
        }*/
        /**
         * d�finition des �tats de la fen�tre, cad des r�gions actives selon l'�tat
         */
        public void setEtat (int etat){
                switch (etat) {
                case initiale: {
                        btnRechIssn.setEnabled(true);
                        btnAnnulerIssn.setEnabled(true);
                        //buttonFermer.setEnabled(false);
                        break;
                        }
                case finale: {
                        btnRechIssn.setEnabled(false);
                        btnAnnulerIssn.setEnabled(false);
                        //buttonFermer.setEnabled(true);
                        break;
                        }
                }
        }
        
        /*
    	 * **********************seter/getter******************************
    	 */
    	public void setPeriodique(Periodique periodique) {
    		_periodique = periodique;
    	}
    	
    	public Periodique getPeriodique() {
    		return _periodique;
    	}
    	
    	public void setParution(Parution parution) {
    		_parution = parution;
    	}
    	
    	public Parution getParu() {
    		return _parution;
    	}
    	
    	public void setArticle(Article a){
    		_article = a;
    	}
    	
    	public Article getArticle(){
    		return _article;
    	}
    	/* fin setter/getter */
    	
    	/*
    	 * fonctions de remplissage des listes******************************
    	 */
    	/**
    	 * remplie la liste de parution
    	 * @param dico le hashmap<Integer, Parution> de parution
    	 */
    	public void alimenteParution(HashMap<Integer, Parution> dico) {
    		dlmParution.clear();
    		for (Parution paru : dico.values()) {
    			dlmParution.addElement(paru.getId());
    		}
    	}   	
     	/**
    	 * remplie la liste d'articles
    	 * @param dico le hashmap<Integer, Article> d'article
    	 */
    	public void alimenteArticle(HashMap<Integer, Article> dico) {
    		dlmArticle.clear();
    		for (Article art : dico.values()) {
    			dlmArticle.addElement(art.getTitre());
    		}
    	}   	
     	/**
    	 * remplie la liste d'auteurs
    	 * @param dico le SortedMap<String, Auteur> d'auteurs
    	 */
    	public void alimenteAuteurs(SortedMap<String, Auteur> dico) {
    		dlmAuteur.clear();
    		for (Auteur auteur : dico.values()) {
    			dlmAuteur.addElement(auteur.getNom());
    			//textAreaAuteur.append(auteur.getNom() +"  " + auteur.getPrenom() +"\n");
    		}
    	}	
}